package com.wechat.service.impl;


import com.wechat.dao.CommonDao;
import com.wechat.service.CommonService;
import com.wechat.utils.beans.Pager;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;

import java.io.Serializable;
import java.util.List;
import java.util.Map;

@Component
public class CommonServiceImpl implements CommonService {

    @Autowired
    protected CommonDao commonDao;


    public <T extends Serializable> T save(T model) {
        return commonDao.save(model);
    }

    public <T extends Serializable> void saveOrUpdate(T model) {
        commonDao.saveOrUpdate(model);
        
    }
    
    public <T extends Serializable> void update(T model) {
        commonDao.update(model);
    }
    
    public <T extends Serializable> void merge(T model) {
        commonDao.merge(model);
    }

    public <T extends Serializable, PK extends Serializable> void delete(Class<T> entityClass, PK id) {
        commonDao.delete(entityClass, id);
    }

    public <T extends Serializable> void deleteObject(T model) {
        commonDao.deleteObject(model);
    }

    public <T extends Serializable, PK extends Serializable> T get(Class<T> entityClass, PK id) {
        return commonDao.get(entityClass, id);
        
    }
    
    public <T extends Serializable> int countAll(Class<T> entityClass) {
        return commonDao.countAll(entityClass);
    }
    
    public <T extends Serializable> List<T> listAll(Class<T> entityClass) {
        return commonDao.listAll(entityClass);
    }


    @Override
    public <T extends Serializable> List<T> findParamListByHQL(String hql, Object... values) {
        return commonDao.findParamListByHQL(hql,values);
    }

    @Override
    public <T extends Serializable> T findByHQL(String hql, Object... values) {

        return commonDao.findByHQL(hql,values);
    }

    /**
     * 通过属性查询唯一结果
     *
     * @param entityClass
     * @param propertyName 属性名
     * @param value        属性值
     * @return
     */
    @Override
    public <T extends Serializable> T findUniqueByProperty(Class<T> entityClass, String propertyName, Object value) {
        return commonDao.findUniqueByProperty(entityClass,propertyName,value);
    }

    /**
     * 通过SQL查询结果集
     *
     * @param entityClass
     * @param sqlString
     * @param values
     * @return
     */
    @Override
    public <T extends Serializable> List<T> findListBySQL(Class<T> entityClass, String sqlString, Object... values) {
        return commonDao.findListBySQL(entityClass,sqlString,values);
    }

    /**
     * 通过sql语句查询结果集
     *
     * @param entityClass
     * @param fromIndex   起始索引
     * @param size        需要获取的结果数
     * @param sqlString   实体示例
     * @param values      排除在外的属性列表
     * @return
     */
    @Override
    public <T extends Serializable> List<T> findListBySQL(Class<T> entityClass, int fromIndex, int size, String sqlString, Object... values) {
        return commonDao.findListBySQL(entityClass,fromIndex,size,sqlString,values);
    }

    /**
     * 使用sql根据数据
     *
     * @param sql 更新的sql语句
     */
    @Override
    public void updateBySql(String sql) {
        commonDao.updateBySql(sql);
    }

    @Override
    public int countSqlQueryResult(String sql, Object... values) {
        return commonDao.countSqlQueryResult(sql,values);
    }

    @Override
    public int countHqlQueryResult(String hql, Object... values) {
        return commonDao.countHqlQueryResult(hql,values);
    }

    @Override
    public <T extends Serializable> Pager<T> findByHQL(int pageNo, int pageSize, String hql, Object... values) {
        return commonDao.findByHQL(pageNo,pageSize,hql,values);
    }

    @Override
    public <T extends Serializable> Pager<T> findByHQL(int pageNo, int pageSize, String hql, List<Object> valueList) {
        return commonDao.findByHQL(pageNo,pageSize,hql,valueList);
    }


    /**
     * MrWang
     * 2015-01-18
     * <p/>
     * 使用jdbc方式查询sql 将查询的结果封装在map中，每一条记录是一个map
     * map的key是字段名（全部转换为小写） value是字段值
     *
     * @param sql
     * @return
     */
    @Override
    public List<Map<String, Object>> findByJdbcSql(String sql, Object... args) {
        return commonDao.findByJdbcSql(sql,args);
    }

    @Override
    public <T extends Serializable> List<T> findListByHQL(int pageNo, int pageSize, String hql, Object... values) {
        return commonDao.findListByHQL(pageNo,pageSize,hql,values);
    }
}
